retry
fun <T> retry(block: () -> Promise<T>, retries: Int = 3, initialDelayMillis: Double = 100.0, maxDelayMillis: Double, factor: Double = 2.0): Promise<T>
Retries block with exponential backoff, gated by this budget -- see com.sorinirmies.arrow.resiliencekit.RetryBudget for why. Rejects with an error whose message starts with "Retry budget exhausted" if the budget runs out before retries does (distinct from the original failure's error, which is what every other exhaustion rejects with).